package tt.dz.egobus.servicemanager.core.config;

import org.apache.commons.lang3.StringUtils;

/**
 * @author Anson
 * @date 17-8-8
 * @name 系统运行配置枚举
 * @since 1.0.6
 */
public enum RuntimeConfigKeyEnum {


    /**
     * PC-WEB端session超时配置(秒为单位)
     */
    USER_LOGIN_SESSION_TIMEOUT
            ("user.login.session.timeout", "PC-WEB端session超时配置(秒为单位)", 15 * 60 * 1000L,
                    ConfigAccessType.SYSTEM),

    /**
     * 单次注册业务搜索的最大的长度(单位米)[默认200KM]
     */
    BUSINESS_DISTANCE_SEARCH_MAX
            ("business.distance.search.max", "单次注册业务搜索的最大的长度(单位米)[默认200KM]", 200000D,
                    ConfigAccessType.OPERATION),

    /**
     * 单次注册业务的最大的长度(单位米)[默认20KM]
     */
    BUSINESS_DISTANCE_SINGLE_MAX
            ("business.distance.single.max", "单次注册业务的最大的长度(单位米)[默认20KM]", 20000,
                    ConfigAccessType.OPERATION),

    /**
     * 抢单司机最优任务队列数[默认500个司机]
     */
    BUSINESS_STANDBY_MAX
            ("business.standby.max", "抢单司机最优任务队列数,[默认500个司机]", 500,
                    ConfigAccessType.SYSTEM),
    /**
     * 司机上传地理位置前缀的Redis存储的前置字符串key
     */
    BUSINESS_POINT_REDIS_KEY
            ("business.point.redis.key", "司机上传地理位置前缀的Redis存储的前置字符串key", "EGOBUS_DISTANCE_POINT_",
                    ConfigAccessType.SYSTEM),

    /**
     * 是否记录业务派单下坐标计算,true,记录,false:不记录
     */
    BUSINESS_POINT_DO_BUSINESS_IS_STORE
            ("business.point.do.business.is.store", "是否记录业务派单下坐标计算,true,记录,false:不记录",
                    false, ConfigAccessType.SYSTEM),


    /**
     * 司机抢单超时时间
     */
    DRIVER_BUSINESS_GRAB_TIMEOUT
            ("driver.business.grab.timeout", "司机抢单超时时间(单位秒)", 50L, ConfigAccessType.OPERATION),

    /**
     * 当前配置需要大于{@linkplain RuntimeConfigKeyEnum#DRIVER_BUSINESS_GRAB_TIMEOUT}的时间
     * 用户派单超时= 司机抢单超时+系统派单时间
     */
    USER_BUSINESS_BUS_REQUEST_TIMEOUT
            ("user.business.bus.request.timeout", "用户请求超时派车时间(单位秒)", 60L, ConfigAccessType.OPERATION),

    /**
     * 系统配置最大范围可抢单的距离
     */
    BUSINESS_GRAB_BUS_DISTRIBUTE_MAX_SEARCH_LIMIT
            ("business.grab.bus.distribute.max.search.limit", "一定范围的司机抢单的距离控制(单位米)", 15000,
                    ConfigAccessType.OPERATION),
    /**
     * 在一定有效时间内系统可允许用户在多久时间段内可取消预约单
     */
    BESPEAK_USER_CANCEL_VALIDATE_LIMIT_SECONDS
            ("bespeak.user.cancel.validate.limit.seconds", "系统可允许用户在多久时间段内可取消预约单(单位秒)", 1 * 60 * 60L,
                    ConfigAccessType.OPERATION),

    /**
     * 获取用户最少的预约时间间隔
     */
    USER_REQUEST_BESPEAK_MIN_LIMIT_SECONDS
            ("user.request.bespeak.min.limit.seconds", "用户请求预约的最少的预约时间间隔(单位秒)", 4 * 60 * 60L,
                    ConfigAccessType.OPERATION),
    /**
     * 获取用户最长的预约时间间隔
     */
    USER_REQUEST_BESPEAK_MAX_LIMIT_SECONDS
            ("user.request.bespeak.max.limit.seconds", "用户请求预约的最长的预约时间间隔(单位秒)", 2 * 24 * 60 * 60L,
                    ConfigAccessType.OPERATION),

    /**
     * 对预约单相对于预约时间提前多久发送短信通知
     */
    NOTIFY_MSG_BEFORE_BESPEAK_TIME_LIMIT_MINUTES
            ("notify.msg.before.bespeak.time.limit.minutes", "相对于预约时间提前多久发送短信通知(单位分钟)", 2 * 60L,
                    ConfigAccessType.OPERATION),;

    public static final RuntimeConfigKeyEnum indexOf(String key) {
        if (StringUtils.isBlank(key)) {
            return null;
        }
        key = key.trim();
        RuntimeConfigKeyEnum[] emuns = RuntimeConfigKeyEnum.values();
        for (RuntimeConfigKeyEnum e : emuns) {
            if (key.equals(e.key.trim())) {
                return e;
            }
        }
        return null;
    }

    private String key = "";

    private final String name;

    private final Object defaultValue;

    private final ConfigAccessType type;

    /**
     * @see tt.dz.egobus.servicemanager.core.resovler.ClassPrototypeEnum
     */
    private final String shortClassName;

    RuntimeConfigKeyEnum(String key, String name, Object defaultValue, ConfigAccessType type) {
        this.key = key;
        this.name = name;
        this.defaultValue = defaultValue;
        this.type = type;
        this.shortClassName = this.dealSimpleTypeNameByDefaultValue();
    }

    RuntimeConfigKeyEnum(String key, String name, Object defaultValue,
                         ConfigAccessType type, String shortClassName) {
        this.key = key;
        this.name = name;
        this.defaultValue = defaultValue;
        this.type = type;
        this.shortClassName = shortClassName;
    }

    public String dealSimpleTypeNameByDefaultValue() {
        if (defaultValue != null) {
            Class<?> clazz = this.defaultValue.getClass();
            String name = clazz.getSimpleName();
            return name.toUpperCase();
        }
        return "STRING";
    }


    public String getKey() {
        return key;
    }

    public String getName() {
        return name;
    }

    public Object getDefaultValue() {
        return defaultValue;
    }


    public ConfigAccessType getType() {
        return type;
    }

    public String getShortClassName() {
        return shortClassName;
    }


}
